#include "Com_Debug.h"
#include "Inf_ES7210.h"
#include "Inf_ES8311.h"
#include "Inf_QMI8658A.h"
#include "Int_TD.h"
#include "driver/gpio.h"
#include "driver/i2c.h"
#include "es7210.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include <stdio.h>

// 重置按键
#define GPIO_REST GPIO_NUM_0

//  创建消息的句柄
static QueueHandle_t gpio_evt_queue;

// 创建一个任务 gpio_task
void gpio_task(void *arg);
// 任务句柄
TaskHandle_t gpio_task_handle;

void gpio_isr_handler(void *arg) {
  // 发送中断消息
  uint32_t gpio_num = (uint32_t)arg;                  // 获取入口参数
  xQueueSendFromISR(gpio_evt_queue, &gpio_num, NULL); // 把入口参数值发送到队列
}

void app_main(void) {
  // gpio_config_t io_conf = {
  //     // 中断类型 GPIO_INTR_NEGEDGE 下降沿触发
  //     .intr_type = GPIO_INTR_NEGEDGE,
  //     // 输入模式
  //     .mode = GPIO_MODE_INPUT,
  //     // 引脚
  //     .pin_bit_mask = (1 << GPIO_REST),
  //     // 上拉
  //     .pull_down_en = 0,
  //     .pull_up_en = 1};
  // gpio_config(&io_conf);

  // // 下降沿触发
  // gpio_set_intr_type(GPIO_NUM_0, GPIO_INTR_NEGEDGE);

  // // 创建一个队列初始GPIO事件
  // gpio_evt_queue = xQueueCreate(10, sizeof(uint32_t));
  // // 创建一个任务
  // xTaskCreate(gpio_task, GPIO_TASK_TAG, 2048, NULL, 10, &gpio_task_handle);

  // // 优先级
  // gpio_install_isr_service(0);
  // // hook isr handler for specific gpio pin
  // gpio_isr_handler_add(GPIO_REST, gpio_isr_handler, (void *)GPIO_REST);

  // 获取加速度数据 I2C 初始化
  // Inf_QMI8658A_Init();
  // Int_TD_Init(); // 初始化

  // 初始化
  //  Inf_ES7210_Init();
  // t_sQMI8658 qmi8658; // 定义结构体变量

  // 初始化
  Inf_ES8311_Init();
  while (1) {
    // qmi8658_Read_AccAndGry(&qmi8658);                                                               // 读取加速度和陀螺仪
    // qmi8658_fetch_angleFromAcc(&qmi8658);                                                           // 计算倾角值
    // printf("AngleX: %f, AngleY: %f, AngleZ: %f\n", qmi8658.AngleX, qmi8658.AngleY, qmi8658.AngleZ); // 打印倾角值
    // ESP_LOGE(TAG, "aaaaaaa");
    vTaskDelay(500);
  }
}

// GPIO任务函数
void gpio_task(void *arg) {
  uint32_t io_num; // 定义变量 表示哪个GPIO
  for (size_t i = 0; i < 100; i++) {
    printf("aaaaa \n");
    if (xQueueReceive(gpio_evt_queue, &io_num, portMAX_DELAY)) { // 死等队列消息
      //  printf(" GPIO任务函数 io_num : %d   gpio_get_level : %d \n", io_num, gpio_get_level(io_num)); // 打印相关内容
      printf(" GPIO任务函数 io_num : %lu  gpio_get_level: %d \n", io_num, gpio_get_level(io_num)); // 打印相关内容
    }
  }
}
